package com.hmall.ebiz.utils;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.hmall.ebiz.model.DbConfig;

import java.io.File;

public class CodeGenerator {

    public static void generateByTables(DbConfig dbconfig, String packageName, String... tableNames) {
        // 数据库信息
        /**
         * driver-class-name: com.mysql.cj.jdbc.Driver
         *     url: jdbc:mysql://47.98.169.251:3306/hmall-dev2?characterEncoding=utf-8
         *     username: root
         *     password: welL&Ccome123
         */
        String dbUrl = "jdbc:mysql://47.98.169.251:3306/hmall-dev2?characterEncoding=utf-8&useSSL=false";
        DataSourceConfig dataSourceConfig = new DataSourceConfig()
                .setDbType(DbType.MYSQL)
                .setUrl(dbUrl)
                .setUsername(dbconfig.getDbUsername())
                .setPassword(dbconfig.getDbPassword())
                .setDriverName(dbconfig.getDbDriverName()) // mysql 8
                ;
        // 配置
        File directory = new File("");// 参数为空
        String courseFile = null;
        try {
            courseFile = directory.getCanonicalPath();
            System.out.println(courseFile);
        }catch (Exception e) {


        }


        GlobalConfig config = new GlobalConfig()
                .setActiveRecord(false)
                .setAuthor("Thomas Wang")
                .setOutputDir(courseFile + "/codeZip/")
                .setFileOverride(true)
                .setEnableCache(false)// XML 二级缓存
                .setBaseResultMap(true)// XML ResultMap
                .setBaseColumnList(true)// XML columList
                .setKotlin(false) //是否生成 kotlin 代码
                // 自定义文件命名，注意 %s 会自动填充表实体属性！
                .setMapperName("%sDao")
                .setXmlName("%sMapper")
                .setServiceName("%sService")
                .setServiceImplName("%sServiceImpl")
                .setControllerName("%sController")
                .setDateType(DateType.ONLY_DATE) //只使用 java.util.date 代替
                .setIdType(IdType.ID_WORKER)
                .setSwagger2(true) // model swagger2
                .setOpen(false) // 是否打开输出目录
                ;

        StrategyConfig strategyConfig = new StrategyConfig()
                .setCapitalMode(true) // 全局大写命名 ORACLE 注意
                //.setDbColumnUnderline(true)
                .setTablePrefix("sys_")// 此处可以修改为您的表前缀(数组),这回影响生成的文件名，文件名前将去掉sys_
                .setNaming(NamingStrategy.underline_to_camel) // 表名生成策略
                .setInclude(tableNames)//修改替换成你需要的表名，多个表名传数组
                //.setExclude(new String[]{"test"}) // 排除生成的表
                .setEntityLombokModel(true) // lombok实体
                .setEntityBuilderModel(false) // 【实体】是否为构建者模型（默认 false）
                .setEntityColumnConstant(false) // 【实体】是否生成字段常量（默认 false）// 可通过常量名获取数据库字段名 // 3.x支持lambda表达式
                //.setLogicDeleteFieldName("is_delete") // 逻辑删除属性名称
                //.setEntityTableFieldAnnotationEnable
                .entityTableFieldAnnotationEnable(true)
                ;

        // 包信息配置
        PackageConfig packageConfig = new PackageConfig()
                .setParent(packageName)
                .setController("controller")
                .setEntity("model")
                .setMapper("dao")
                .setService("service")
                .setXml("mapper");

        // 执行器
        new AutoGenerator()
                .setGlobalConfig(config)
                .setDataSource(dataSourceConfig)
                .setStrategy(strategyConfig)
                .setPackageInfo(packageConfig)
                .execute();
    }
}
